//线性表的创建
/*
Operation

InitList（&L）：初始化操作，建立一个空的线性表L。

DestoryList（&L）：线性表已存在，销毁线性表L。

ClearList(&L):线性表已存在，将L重置为空表。

ListEmpty（L）:线性表已存在,若L为空表，则返回TRUE，否则返回FALSE.

ListLength（L）：线性表已存在,返回线性表的数据元素的个数。

GetElem（L,I,&x）：线性表已存在，并且1< i <ListLength,用x返回L中第i个元素的值。

ListInsert（&L,i，e）线性表已存在，并且1< i <ListLength,在i之前位置插入新的数据元素，L的长度加1。

ListDelist（&L，i，&e）线性表已存在，并且1< i <ListLength,删除线性表L的第i个元素，并且用e返回其值，L的长度减1。

InsertList_Back(*L, x):线性表已存在 ,从线性表的尾部开始插入元素，L的长度加1。 

InsertList_Front(*L, ElemType x)：线性表已存在 ,从线性表的头部开始插入元素，L的长度加1。

DelitelList_Back(*L)：线性表已存在 ,从线性表的尾部开始删除元素，L的长度减1。

DelitelList_Front(*L)：线性表已存在 ,从线性表的头部开始删除元素，L的长度减1。

Delite_Val(*L, key)：线性表已存在，如果线性表中存在key值，则删除线性表中的key值，L的长度减1,并且返回TRUE,如果线性表中不存在key值，则返回FALSE.

void   Clear(*L):线性表已存在,清空现象表中的所有元素。

void   Sort(*L);线性表已存在，对线性表中存在的元素排序。排序成功返回TRUE，排序失败返回FALSE。

Reverse (*L)：线性表已存在，并且顺序表中存在元素，逆置。逆置成功返回TRUE，失败返回FALSE。

void   Show_list(*L)：线性表已存在，打印输出，线性表中 所有元素。
*/
#include <stdio.h>
#include <malloc.h>

#define MaxSize 50
#define ERROR 0
#define OK 1

typedef int statue;
typedef int ElemType;
typedef struct
{
	ElemType *elem;
	int length;	  //线性表当前含有元素长度
	int capacity; //线性表最大长度
} SqList;

void InitList(SqList *L) //初始化线性表，构造一个空的线性表，并将长度设置为0
{
	L->capacity = MaxSize;

	L->elem = (ElemType *)malloc(sizeof(ElemType) * L->capacity);

	L->length = 0;
}
void DestoryList(SqList *L)
{
	free(L->elem);
	L->elem = NULL;
	L->length = 0;
	L->capacity = 0;
}

//ClearList(&L):线性表已存在，将L重置为空表。
void ClearList(SqList *L)
{
	L->length = 0;
}

//ListEmpty（L）:线性表已存在,若L为空表，则返回TRUE，否则返回FALSE.
statue ListEmpty(SqList *L)
{
	if (L->length == 0)
		return ERROR;
	else
		return OK;
}

//GetElem（L,I,&x）：线性表已存在，并且1< i <ListLength,用x返回L中第i个元素的值。
int GetElem(SqList *L, int I, int *X)
{
	if (I < 0 || I > L->length)
	{
		printf("ERROR\n");
		return ERROR;
	}
	else
	{
		*X = L->elem[I];
		return *X;
	}
}

//insert(L,x),在尾部插入x

int insertend(SqList *L, int x)
{
	if (L->length >= L->capacity)
	{
		return ERROR;
	}
	else
	{
		L->elem[L->length] = x;
		L->length++;
		return OK;
	}
}
//头插

int insertstart(SqList *L, int x)
{
	int temp;
	if (L->length >= L->capacity)
	{
		printf("无法插入，空间已满");
		return ERROR;
	}
	else
	{
		for (int i = L->length; i >= 0; i--)
		{
			L->elem[i + 1] = L->elem[i];
		}
		L->elem[0] = x;
		L->length++;
		return OK;
	}
}
//输出所有元素
void printlist(SqList *L)
{
	for (int i = 0; i < L->length; i++)
	{
		printf("%d\t", L->elem[i]);
	}
	printf("\n");
}
int main()
{

	SqList L;
	InitList(&L);
	for (int i = 0; i < 4; i++)
		insertend(&L, i);
	printlist(&L);

	int x;
	GetElem(&L, 0, &x);
	printf("%d\n", x);

	insertend(&L, 777);
	printlist(&L);

	insertstart(&L, 666);
	printlist(&L);

	DestoryList(&L);
}
